package com.qcby.domain.core.plugins;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.PageUtil;
import cn.hutool.core.util.ReflectUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.qcby.types.pojo.page.PageResult;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @author cong.zhen
 * @date 2024/04/15
 */
public class PageResultFactory {

    public PageResultFactory() {
    }

    public static <E> PageResult<E> createPageResult(IPage<E> page) {
        PageResult pageResult = new PageResult();
        pageResult.setRows(page.getRecords());
        pageResult.setTotalRows(Convert.toInt(page.getTotal()));
        pageResult.setPageNo(Convert.toInt(page.getCurrent()));
        pageResult.setPageSize(Convert.toInt(page.getSize()));
        pageResult.setTotalPage(PageUtil.totalPage(pageResult.getTotalRows(), pageResult.getPageSize()));
        return pageResult;
    }

    public static <R, E> PageResult<R> createPageResult(IPage<E> page, Class<R> rClass) {
        PageResult pageResult = new PageResult();
        pageResult.setRows((List)page.getRecords().stream().map((e) -> {
            R r = ReflectUtil.newInstanceIfPossible(rClass);
            BeanUtil.copyProperties(e, r, new String[0]);
            return r;
        }).collect(Collectors.toList()));
        pageResult.setTotalRows(Convert.toInt(page.getTotal()));
        pageResult.setPageNo(Convert.toInt(page.getCurrent()));
        pageResult.setPageSize(Convert.toInt(page.getSize()));
        pageResult.setTotalPage(PageUtil.totalPage(pageResult.getTotalRows(), pageResult.getPageSize()));
        return pageResult;
    }

    public static <R, E> PageResult<R> createPageResult(IPage<E> page, IObjMapper<E, R> objMapper) {
        PageResult pageResult = new PageResult();
        pageResult.setRows((List)page.getRecords().stream().map((e) -> {
            return objMapper.to(e);
        }).collect(Collectors.toList()));
        pageResult.setTotalRows(Convert.toInt(page.getTotal()));
        pageResult.setPageNo(Convert.toInt(page.getCurrent()));
        pageResult.setPageSize(Convert.toInt(page.getSize()));
        pageResult.setTotalPage(PageUtil.totalPage(pageResult.getTotalRows(), pageResult.getPageSize()));
        return pageResult;
    }
}
